From aca252837d976eeb46db5a0363d94d5f9d72c2c2 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 6 Jan 2020 20:09:47 -0500 Subject: [PATCH] dragsource: Make ::prepare return a boolean Make ::prepare return TRUE to start a drag. The default handler simply checks that we have a content provider and actions. --- gtk/gtkdragsource.c | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/gtk/gtkdragsource.c b/gtk/gtkdragsource.c index bee4c4c8c8..022043283f 100644 --- a/gtk/gtkdragsource.c +++ b/gtk/gtkdragsource.c @@ -99,6 +99,10 @@ struct _GtkDragSource struct _GtkDragSourceClass { GtkGestureSingleClass parent_class; + + gboolean (* prepare) (GtkDragSource *source, + double x, + double y); }; enum { @@ -125,6 +129,9 @@ static void gtk_drag_source_cancel_cb (GdkDrag *drag, GdkDragCancelReason reason, GtkDragSource *source); +static gboolean gtk_drag_source_prepare (GtkDragSource *source, + double x, + double y); G_DEFINE_TYPE (GtkDragSource, gtk_drag_source, GTK_TYPE_GESTURE_SINGLE); @@ -267,6 +274,8 @@ gtk_drag_source_class_init (GtkDragSourceClass *class) gesture_class->update = gtk_drag_source_update; gesture_class->end = NULL; + class->prepare = gtk_drag_source_prepare; + /** * GtkDragSource:content: * @@ -301,10 +310,10 @@ gtk_drag_source_class_init (GtkDragSourceClass *class) g_signal_new (I_("prepare"), G_TYPE_FROM_CLASS (class), G_SIGNAL_RUN_LAST, - 0, - NULL, NULL, + G_STRUCT_OFFSET (GtkDragSourceClass, prepare), + g_signal_accumulator_first_wins, NULL, NULL, - G_TYPE_NONE, 2, + G_TYPE_BOOLEAN, 2, G_TYPE_DOUBLE, G_TYPE_DOUBLE); /** @@ -373,6 +382,14 @@ gtk_drag_source_class_init (GtkDragSourceClass *class) GDK_TYPE_DRAG_CANCEL_REASON); } +static gboolean +gtk_drag_source_prepare (GtkDragSource *source, + double x, + double y) +{ + return source->content != NULL && source->actions != 0; +} + static void drag_end (GtkDragSource *source, gboolean success) @@ -438,6 +455,7 @@ gtk_drag_source_drag_begin (GtkDragSource *source, GdkSurface *surface; double px, py; int dx, dy; + gboolean start_drag = FALSE; g_return_if_fail (GTK_IS_DRAG_SOURCE (source)); g_return_if_fail (GTK_IS_WIDGET (widget)); @@ -457,9 +475,9 @@ gtk_drag_source_drag_begin (GtkDragSource *source, dx = round (px) - x; dy = round (py) - y; - g_signal_emit (source, signals[PREPARE], 0, x, y); + g_signal_emit (source, signals[PREPARE], 0, x, y, &start_drag); - if (source->content == NULL || source->actions == 0) + if (!start_drag) return; source->drag = gdk_drag_begin (surface, device, source->content, source->actions, dx, dy); -- 2.30.2